package 设计模式;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理：我傻了
 */
public class ProxyTest {
    public static void main(String[] args) {
        SuperMan superMan = new SuperMan();
        Human proxy = (Human) ProxyFactory.getProxyFactoryInstance(superMan);
        String belief = proxy.getBelief();
        System.out.println(belief);
        proxy.eat("章鱼丸子");
    }
}
//被代理类
class SuperMan implements Human{
    @Override
    public String getBelief() {
        return "I am nobody";
    }

    @Override
    public void eat(String food) {
        System.out.println("我想吃"+food);
    }
}
//重点一
class ProxyFactory{
    //根据加载到内存的被代理类，动态的创建一个代理类的对象,返回一个代理类的对象
    public static Object getProxyFactoryInstance(Object obj){
        MyInvocationHandler handler = new MyInvocationHandler();
        handler.bind(obj);
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),handler);
    }
}
//重点二
class MyInvocationHandler implements InvocationHandler {
    //使用被代理的对象进行赋值
    private Object obj;
    public void bind(Object obj){
        this.obj=obj;
    }
    //当通过代理类对象调用方法时，会自动调用invoke()方法,将被代理类要执行的方法功能声明在invoke()中
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //method:即为代理类对象和被代理对象都要调用的方法
        return method.invoke(obj, args);
    }
}
interface Human{
    String getBelief();
    void eat(String food);
}